package open.intellijboy.framework.core.response;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serial;
import java.io.Serializable;

/**
 * 统一 API 响应结果封装类
 *
 * @param <T> 响应数据的类型
 */
@Data
@Accessors(chain = true)
@JsonInclude(JsonInclude.Include.NON_NULL) // 不序列化 null 字段
public class Result<T> implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;
    public static final String SUCCESS = "success";
    public static final String MESSAGE = "操作失败";

    /**
     * 响应码：0 表示成功，非 0 表示失败
     */
    private String code;

    /**
     * 响应消息：成功时可为 "success"，失败时为错误描述
     */
    private String message;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 时间戳（可选，用于调试或前端缓存控制）
     */
    private Long timestamp;

    // --------------------- 构造私有化，使用静态工厂方法 ---------------------

    private Result() {
        this.timestamp = System.currentTimeMillis();
    }

    // --------------------- 成功响应 ---------------------

    public static <T> Result<T> success() {
        return new Result<T>().setCode(StatusCode.SUCCESS.getCode()).setMessage(SUCCESS);
    }

    public static <T> Result<T> success(T data) {
        return new Result<T>().setCode(StatusCode.SUCCESS.getCode()).setMessage(SUCCESS).setData(data);
    }

    public static <T> Result<T> success(String message, T data) {
        return new Result<T>().setCode(StatusCode.SUCCESS.getCode()).setMessage(message).setData(data);
    }

    // --------------------- 失败响应 ---------------------

    public static <T> Result<T> failure() {
        return new Result<T>().setCode(StatusCode.SYSTEM_ERROR_B0001.getCode()).setMessage(MESSAGE);
    }

    public static <T> Result<T> failure(String message) {
        return new Result<T>().setCode(StatusCode.SYSTEM_ERROR_B0001.getCode()).setMessage(message);
    }

    public static <T> Result<T> failure(String code, String message) {
        return new Result<T>().setCode(StatusCode.SYSTEM_ERROR_B0001.getCode()).setMessage(message);
    }

    public static <T> Result<T> failure(StatusCode statusCode) {
        return new Result<T>().setCode(statusCode.getCode()).setMessage(StatusCode.SYSTEM_ERROR_B0001.getDescription());
    }

    // --------------------- 自定义构建器（可选） ---------------------


    // ==================== 构建器方法 ====================

    /**
     * 创建一个 Result 构建器
     */
    public static <T> Result<T> builder() {
        return new Result<>();
    }

    /**
     * 设置响应码
     */
    public Result<T> code(String code) {
        this.code = code;
        return this;
    }

    /**
     * 设置响应码
     */
    public Result<T> code(StatusCode statusCode) {
        this.code = statusCode.getCode();
        return this;
    }

    /**
     * 设置响应消息
     */
    public Result<T> message(String message) {
        this.message = message;
        return this;
    }

    /**
     * 设置响应数据
     */
    public Result<T> data(T data) {
        this.data = data;
        return this;
    }

    /**
     * 设置时间戳（通常不需要手动设置）
     */
    public Result<T> timestamp(Long timestamp) {
        this.timestamp = timestamp;
        return this;
    }

    /**
     * 构建完成，返回 Result 对象
     * （实际上 this 就是构建好的对象，此方法主要用于语义清晰）
     */
    public Result<T> build() {
        return this;
    }
}